package com.wakaca.design.pattern.creational.singleton;

/**
 * 延迟单例模式 - 双重检查
 * Created by wakava
 */
public class LazyDoubleCheckSingleton {

    private volatile static LazyDoubleCheckSingleton lazyDoubleCheckSingleton = null;
    private LazyDoubleCheckSingleton(){}

    // 可以减少性能开销
    public static LazyDoubleCheckSingleton getInstance(){
        if(lazyDoubleCheckSingleton == null){
            synchronized (LazyDoubleCheckSingleton.class){
                if(lazyDoubleCheckSingleton == null){
                    lazyDoubleCheckSingleton = new LazyDoubleCheckSingleton(); // 这行执行了下面这三个操作
                    //1.分配内存给这个对象
//                  //3.设置 lazyDoubleCheckSingleton 指向刚分配的内存地址
                    //2.初始化对象
//                    intra-thread semantics（这个规定保证重排序不会改变单线程内的程序执行结果，
//                          也就是2 和 3重排序是允许的，这样可以提高程序的执行性能）
//                    ---------------//3.设置 lazyDoubleCheckSingleton 指向刚分配的内存地址
                }
            }
        }
        return lazyDoubleCheckSingleton;
    }

}
